﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Application.Structure.Decorator
{
	public enum Taille { Petit, Moyen, Grand };

	public abstract class Boisson
	{
		// ATTRIBUTS
		protected string _strDescription;
		public virtual string Description
		{
			get { return String.Format("{0} {1}",_strDescription, _enumTaille.ToString().ToLower()); }
			//set { _strDescription = value; }
		}

		protected Taille _enumTaille;
		public virtual Taille Taille
		{
			get { return _enumTaille; }
		}

		// CONSTRUCTEUR
		public Boisson()
		{
			_strDescription = "Boisson inconue";
			_enumTaille = Taille.Moyen;
		}

		// METHODES
		public abstract double getCount();

		public virtual void Afficher()
		{
			Console.WriteLine("{0} pour {1} euros", Description, getCount() );
		}
	}

	public class Cafe : Boisson
	{
		// ATTRIBUTS

		// CONSTRUCTEUR
		public Cafe() : base()
		{
			_strDescription = "Café";
		}

		public Cafe( Taille enumTaille )
		{
			_strDescription = "Café";
			this._enumTaille = enumTaille;
		}

		

		// METHODES
		public override double getCount()
		{
			double dPrix = 0.0;
			switch (Taille)
			{
				case Taille.Petit:
					dPrix = 0.70;
					break;
				case Taille.Moyen:
					dPrix = 0.90;
					break;
				case Taille.Grand:
				default:
					dPrix = 1.20;
					break;
			}
			return dPrix;
		}
	}

	public class Expresso : Boisson
	{
		// ATTRIBUTS

		// CONSTRUCTEUR
		public Expresso() : base()
		{
			_strDescription = "Expresso";
		}

		public Expresso(Taille enumTaille)
			: base()
		{
			this._strDescription	= "Expresso";
			this._enumTaille		= enumTaille;
		}

		// METHODES
		public override double getCount()
		{
			double dPrix = 0.0;
			switch (Taille)
			{
				case Taille.Petit:
					dPrix = 1.10;
					break;
				case Taille.Moyen:
					dPrix = 1.30;
					break;
				case Taille.Grand:
				default:
					dPrix = 1.50;
					break;
			}
			return dPrix;
		}
	}

	public abstract class DecorateurBoisson : Boisson
	{
		public override abstract string Description {get;}		
	}

	public class Sucre : DecorateurBoisson
	{
		// ATTRIBUTS
		Boisson _oBoisson;
				
		public override string Description
		{
			get { return _oBoisson.Description + ", Sucre"; }			
		}

		// CONSTRUCTEUR
		public Sucre( Boisson oBoisson )
		{
			this._oBoisson = oBoisson;
		}

		// METHODES
		//public 

		public override double getCount()
		{			
			double dPrix = _oBoisson.getCount();
			switch (Taille)
			{
				case Taille.Petit:
					dPrix += 0.1;
					break;
				case Taille.Moyen:
					dPrix += 0.2;
					break;
				case Taille.Grand:
				default:
					dPrix += 0.3;
					break;
			}
			return dPrix;
		}
	}

	public class Chantilly : DecorateurBoisson
	{
		// ATTRIBUTS
		Boisson _oBoisson;

		public override string Description
		{
			get { return _oBoisson.Description + ", Chantilly"; }
		}

		// CONSTRUCTEUR
		public Chantilly(Boisson oBoisson)
		{
			this._oBoisson = oBoisson;
		}

		// METHODES
		//public 

		public override double getCount()
		{			
			double dPrix = _oBoisson.getCount();
			switch (Taille)
			{
				case Taille.Petit:
					dPrix += 0.3;
					break;
				case Taille.Moyen:
					dPrix += 0.5;
					break;
				case Taille.Grand:
				default:
					dPrix += 0.7;
					break;
			}
			return dPrix;
		}
	}
}
